/* * Copyright (c) 2014, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * */ package com.facebook.crypto.benchmarks; import javax.crypto.Mac; import java.io.OutputStream; import java.security.Security; import java.util.Random; import com.facebook.crypto.benchmarks.cipher.AESCipher; import com.facebook.crypto.benchmarks.cipher.BouncyCastleGCMCipher; import com.facebook.crypto.benchmarks.cipher.NativeGCMCipherHelper; import com.facebook.crypto.benchmarks.mac.HMAC; import com.facebook.crypto.benchmarks.mac.NativeMacHelper; import com.facebook.crypto.benchmarks.mac.streams.MacLayeredOutputStream; import com.google.caliper.Param; import com.google.caliper.SimpleBenchmark; import com.google.common.io.NullOutputStream; import org.spongycastle.jce.provider.BouncyCastleProvider; public class CipherWriteBenchmark extends SimpleBenchmark { private byte[] mData; private NullOutputStream mNullOutputStream; private HMAC mHMAC; private NativeGCMCipherHelper mNativeGCMCipherHelper; // This field is purposely here so that we can get a // reference to NativeMac which is necessary for // library initialization. private NativeMacHelper mNativeMacHelper; private AESCipher mAESCipher; private BouncyCastleGCMCipher mBCGCMCipher; @Param({"102400"}) int size; @Override public void setUp() throws Exception { Random random = new Random(); mData = new byte[size]; random.nextBytes(mData); mNullOutputStream = new NullOutputStream(); mHMAC = HMAC.getInstance(); mNativeGCMCipherHelper = NativeGCMCipherHelper.getInstance(); mAESCipher = AESCipher.getInstance(); Security.addProvider(new BouncyCastleProvider()); mBCGCMCipher = BouncyCastleGCMCipher.getInstance(); } public void timeAESWithHMAC(int reps) throws Exception { for (int i = 0; i < reps; ++i) { Mac mac = mHMAC.getMac(); MacLayeredOutputStream macOs = new MacLayeredOutputStream(mac, mNullOutputStream); OutputStream aes = mAESCipher.getOutputStream(macOs); aes.write(mData); aes.close(); mac.doFinal(); } } public void timeNativeGCM(int reps) throws Exception { byte[] buffer = new byte[1024]; for (int i = 0; i < reps; ++i) { OutputStream output = mNativeGCMCipherHelper.getOutputStream(mNullOutputStream, buffer); output.write(mData); output.close(); } } public void timeBouncycastleGCMCipher(int reps) throws Exception { for (int i = 0; i < reps; ++i) { OutputStream output = mBCGCMCipher.getOutputStream(mNullOutputStream); output.write(mData); output.close(); } } }